home *** CD-ROM | disk | FTP | other *** search
- /*==============================================================================
-
- FICHERO: TGA.C
-
- AUTOR: ANTONIO LADESA JURADO
-
- FECHA: 24/6/94
-
- DESCRIPCION:
-
- Fichero que contiene las estructuras, constantes, variables y funciones
- internas y externas para el procesamiento de ficheros TGA.
-
- ==============================================================================*/
-
-
- /*---- MODULOS USADOS --------------------------------------------------------*/
-
- #include <stdio.h>
- #include <string.h>
- #include <alloc.h>
-
- #include "global.h"
- #include "memoria.h"
- #include "video.h"
- #include "tga.h"
- #include "error.h"
-
-
- /*---- ESTRUCTURAS, CONSTANTES Y VARIABLES LOCALES AL MODULO -----------------*/
-
-
- /* cabecera de un fichero TGA */
- typedef struct
- {
- char longitud;
- char mapa_color;
- char tipo_imagen;
- int indice_mapa;
- int entradas_mapa;
- char tam_color;
- int inf_izda_hor;
- int inf_izda_ver;
- int ancho;
- int alto;
- char prof_color_pixel;
- char orden;
- }
- CABtga;
-
- /* cabecera del fichero TGA */
- static CABtga cabecera;
-
-
- /*---- DEFINICION DE LAS FUNCIONES INTERNAS ----------------------------------*/
-
-
- IMAGEN *TGAleerCabecera(IMAGEN *c,FILE *f,char *nombre);
- IMAGEN *TGAleerImagen(IMAGEN *c,FILE *f);
- void TGAleerLinea(char *p, FILE *f,int bytes);
-
- void TGAcrearCabecera(IMAGEN *c);
- void TGAescribirImagen(IMAGEN *c,FILE *f);
- void TGAescribirLinea(char *p,FILE *f,int bytes);
-
-
- /*---- CODIFICACION DE LAS FUNCIONES OFRECIDAS -------------------------------*/
-
-
- /*---- FUNCION: extern IMAGEN *TGAcargar(char *nombre,IMAGEN *c) ---------------
-
- Descripción:
-
- Esta función carga en memoria una imagen de tipo TGA.
-
- Parámetros:
-
- char *nombre : nombre del fichero a cargar
- IMAGEN *c : puntero a estructura que alberga la imagen
-
- Retorno:
-
- Puntero a la estructura de la imagen o NULL si hubo error
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern IMAGEN *TGAcargar(char *nombre,IMAGEN *c)
- {
- /* puntero al fichero de entrada */
- FILE *f;
-
- /* abrir fichero */
- if((f = fopen(nombre, "rb")) != NULL)
- {
- /* leer cabecera TGA */
- if((c = TGAleerCabecera(c,f,nombre))!=NULL)
- {
- /* cargar imagen TGA */
- TGAleerImagen(c,f);
- }
- }
- else
- {
- ERRORponer(ERRapertura);
- return(NULL);
- }
- return(c);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: extern int *TGAsalvar(char *nombre,IMAGEN *c) ---------------
-
- Descripción:
-
- Esta función salva en disco una imagen con formato TGA.
-
- Parámetros:
-
- char *nombre : nombre del fichero a salvar
- IMAGEN *c : puntero a estructura que alberga la imagen
-
- Retorno:
-
- - 0 si hay error
- - 1 en caso contrario
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- /* salvar un fichero TGA */
- extern int TGAsalvar(char *fichero,IMAGEN *c)
- {
- /* puntero al fichero de salida */
- FILE *f;
- /* contador */
- int i;
-
- /* abrir el fichero */
- if((f = fopen(fichero, "wb")) == NULL)
- {
- ERRORponer(ERRapertura);
- return(0);
- }
-
- /* si la imagen es monocromática se guarda en 8 pixels por byte */
- if(c->colores == 2 && c->modo != VIDEOmono)
- c=VIDEOvision(c);
-
- /* crear la cabecera TGA */
- TGAcrearCabecera(c);
-
- /* escribir la cabecera TGA */
- if(fwrite((char *)&cabecera,1,sizeof(CABtga),f) != sizeof(CABtga))
- {
- ERRORponer(ERRapertura);
- return(0);
- }
-
- /* escribir paleta TGA que viene invertida (RGB -> BGR) */
- if(c->colores != 2)
- for(i=0;i<c->colores*3;i+=3)
- {
- fputc(c->paleta[i+2],f);
- fputc(c->paleta[i+1],f);
- fputc(c->paleta[i],f);
- }
-
- /* escribir la imagen TGA */
- TGAescribirImagen(c,f);
-
- fclose(f);
- return(1);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- CODIFICACION DE LAS FUNCIONES INTERNAS --------------------------------*/
-
-
- /*---- FUNCION: IMAGEN *TGAleerCabecera(IMAGEN *c,FILE *f,char *nombre) --------
-
- Descripción:
-
- Esta función reserva memoria para la imagen y lee la cabecera del fichero
- TGA.
-
- Parámetros:
-
-
- IMAGEN *c : puntero a estructura que alberga la imagen
- FILE *f : puntero al fichero
- char *nombre : nombre del fichero a cargar
-
- Retorno:
-
- Puntero a la estructura de la imagen o NULL si hubo error
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- IMAGEN *TGAleerCabecera(IMAGEN *c,FILE *f,char *nombre)
- {
- /* leer cabecera TGA */
- if(fread((char *)&cabecera,1,sizeof(CABtga),f) != sizeof(CABtga))
- {
- ERRORponer(ERRlectura);
- return(NULL);
- }
-
- /* reservar memoria para la cabecera de trabajo */
- if((c=MEMreservarCAB(c))==NULL)
- {
- ERRORponer(ERRnoMemoria);
- return(NULL);
- }
-
- /* cargar cabecera de trabajo */
- strcpy(c->nombre,nombre);
- c->ancho = cabecera.ancho;
- c->alto = cabecera.alto;
- c->formato = TGA;
-
- /* determinar tipo de imagen */
- switch(cabecera.tipo_imagen)
- {
- case 1:
- case 9:
- c->modo = VIDEOvga;
- c->bytes = (cabecera.prof_color_pixel / 8) * c->ancho;
- c->colores = cabecera.entradas_mapa;
- c->haypaleta = CIERTO;
- break;
-
- case 3:
- case 11:
- c->modo = VIDEOmono;
- c->bytes = DePixelsABytes(c->ancho);
- c->colores = 2;
- c->haypaleta = FALSO;
- break;
-
- default:
- c = MEMliberar(c);
- ERRORponer(ERRnoTratado);
- return(c);
- };
-
- /* si tiene paleta propia, cargarla */
- if(cabecera.mapa_color)
- {
- fread((char *)c->paleta,1,(cabecera.tam_color/8)*cabecera.entradas_mapa,f);
- /* la paleta de los ficheros TGA esta en formato BGR */
- memcpy(c->paleta,VIDEOinvertirPaleta(c->paleta,c->colores),c->colores*3);
- }
-
- /* si no hay memoria, liberar cabecera */
- if(!MEMreservar(c))
- {
- c = MEMliberar(c);
- ERRORponer(ERRnoMemoria);
- return(c);
- }
- return(c);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: IMAGEN *TGAleerImagen(IMAGEN *c,FILE *f) -----------------------
-
- Descripción:
-
- Esta función carga en memoria una imagen de tipo TGA.
-
- Parámetros:
-
-
- IMAGEN *c : puntero a estructura que alberga la imagen
- FILE *f : puntero al fichero
-
- Retorno:
-
- Puntero a la estructura de la imagen
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- IMAGEN *TGAleerImagen(IMAGEN *c,FILE *f)
- {
- /* contador de lineas */
- int i;
- /* buffer */
- char p[1024];
- /* linea actual */
- int linea;
-
- /* cargar imagen */
- for(i = 0; i < c->alto ; i++)
- {
- /* leer linea */
- TGAleerLinea(p,f,c->bytes);
- /* si estan en orden horizontal inverso, invertir linea */
- if(cabecera.orden & 0x10)
- memcpy(p,VIDEOinvertirLinea(c,p),c->bytes);
- /* llevar la linea a memoria segun el orden vertical */
- if(cabecera.orden & 0x20)
- linea = i;
- else
- linea = c->alto-1-i;
- MEMescribir(p,linea,c);
- }
- return(c);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: void TGAleerLinea(char *p, FILE *f,int bytes) ------------------
-
- Descripción:
-
- Esta función lee una línea de un fichero TGA.
-
- Parámetros:
-
- char *p : puntero a buffer donde se almacena la línea
- FILE *f : puntero al fichero
- int bytes: numero de bytes por linea
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void TGAleerLinea(char *p, FILE *f,int bytes)
- {
- fread((char *)p,bytes,1,f);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: void TGAcrearCabecera(IMAGEN *c) ------------------------------------
-
- Descripción:
-
- Esta función crea una cabecera TGA.
-
- Parámetros:
-
- IMAGEN *c : puntero a estructura que alberga la imagen
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void TGAcrearCabecera(IMAGEN *c)
- {
- /* rellena los datos de la cabecera */
- cabecera.longitud = 0;
- cabecera.inf_izda_hor = 0;
- cabecera.inf_izda_ver = 0;
- cabecera.ancho = c->ancho;
- cabecera.alto = c->alto;
- cabecera.orden = 0x20;
- switch(c->modo)
- {
- case VIDEOmono:
- cabecera.mapa_color = 0;
- cabecera.tipo_imagen = 3;
- cabecera.indice_mapa = 0;
- cabecera.entradas_mapa = 0;
- cabecera.tam_color = 0;
- cabecera.prof_color_pixel = 1;
- break;
- case VIDEOega:
- case VIDEOvga:
- cabecera.mapa_color = 1;
- cabecera.tipo_imagen = 1;
- cabecera.indice_mapa = 0;
- cabecera.entradas_mapa = c->colores;
- cabecera.tam_color = 24;
- cabecera.prof_color_pixel = 8;
- break;
- }
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: void TGAescribirImagen(IMAGEN *c,FILE *f) ----------------
-
- Descripción:
-
- Esta función graba la imagen en un fichero TGA.
-
- Parámetros:
-
- IMAGEN *c : puntero a estructura que alberga la imagen
- FILE *f : puntero al fichero
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void TGAescribirImagen(IMAGEN *c,FILE *f)
- {
- /* contador de lineas */
- int i;
- /* buffers */
- char p[1024];
- char q[1024];
-
- /* salvar imagen */
- switch(c->modo)
- {
- case VIDEOmono:
- case VIDEOvga:
- for(i = 0; i < c->alto;++i)
- {
- MEMleer(p,i,c);
- TGAescribirLinea(p,f,c->bytes);
- }
- break;
- /* las imagenes EGA se transforman a VGA (1 byte por pixel) */
- case VIDEOega:
- for(i = 0; i < c->alto;++i)
- {
- MEMleer(p,i,c);
- EGAaVGA(p,q,c->ancho);
- TGAescribirLinea(q,f,c->ancho);
- }
- break;
- }
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: void TGAescribirLinea(char *p, FILE *f,int bytes) ---------------
-
- Descripción:
-
- Esta función escribe una línea en un fichero TGA.
-
- Parámetros:
-
- char *p : puntero a buffer que alberga la línea
- FILE *f : puntero al fichero
- int bytes : numero de bytes por línea
-
- Retorno:
-
- Puntero a la estructura de la imagen o NULL si hubo error
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void TGAescribirLinea(char *p, FILE *f,int bytes)
- {
- fwrite((char *)p,bytes,1,f);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/